import { isFunction } from "./utils";
import { observe } from './observe/index'
export function initState(vm) {
  const opts = vm.$options;
  if (opts.data) {
    initData(vm)
  }
}
function proxy(vm, key, source) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[source][key]
    },
    set(newVal) {
      vm[source][key] = newVal
      // 如果data中赋值为对象，对对象也要进行监听
      // observe(newVal) // TODO:在真实set中对newVal监听，不在代理中监听，否则重复定义报错
    }
  })
}

function initData(vm) {
  let data = vm.$options.data;
  /* 
  1.给vm拓展_data属性 vm.$options.data = vm._data;
  2.给vm扩展data中的属性 vm.$options.data.arr = vm.arr
  */

  //data和vm_data引用的是同一个，data通过observe劫持进行观测，vm._data也被劫持
  data = vm._data = isFunction(data) ? data.call(vm) : data;

  // 需要将data变为响应式的
  observe(data)

  for (let key in data) {
    proxy(vm, key, '_data')
  }

}